home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Freeware / reportplus / source / f4.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-03-13  |  68.1 KB  |  1,668 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <proto/exec.h>
  4. #include <intuition/intuition.h>
  5. #include <intuition/gadgetclass.h>
  6. #include <proto/intuition.h>
  7. #include <libraries/gadtools.h>
  8. #include <proto/gadtools.h>
  9.  
  10. #include <ctype.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include "rp.h"
  14.  
  15. #define ALL_REACTION_CLASSES
  16. #include <reaction/reaction.h>
  17. #include <clib/texteditor_protos.h>
  18. #include <gadgets/texteditor.h>
  19. #include <pragmas/texteditor_pragmas.h>
  20.  
  21. #define MAXELEMENTS_4 14 // counting from 0
  22.  
  23. MODULE void bizarre(void);
  24. MODULE void updateautodocgadgets(void);
  25. MODULE void readautodocgadgets(void);
  26. MODULE void starify(STRPTR buffer);
  27. MODULE void destarify(STRPTR buffer);
  28. MODULE ULONG parseeither(STRPTR terminator1, STRPTR terminator2);
  29. MODULE void numberofinputs(void);
  30.  
  31. MODULE UBYTE*               StarBufferPtr = NULL;
  32. MODULE ULONG                elements,
  33.                             returncode,
  34.                             inputs;
  35. MODULE struct Gadget*       autodoc_gadgets[GIDS_4 + 1];
  36.  
  37. /* Current limitations:
  38.   * 4K characters per text editor field. This limitation is
  39.     not currently enforced by the program. Ideally we would like to use
  40.     TEXTEDITOR_MaxChars or suchlike. Using strncpy() with a limit of 4K
  41.     when reading from the text editor gadgets or reading from a file would
  42.     also be good.
  43.   * 16K characters for the entire autodoc. */
  44.  
  45. AGLOBAL struct AutodocStruct autodoc;
  46.  
  47. IMPORT struct Menu*        MenuPtr;
  48. IMPORT Object*             WinObject[FUNCTIONS + 1];
  49. IMPORT struct Screen*      ScreenPtr;
  50. IMPORT struct Window*      MainWindowPtr;
  51. IMPORT struct SharedStruct shared;
  52. IMPORT struct Library*     TextEditorBase;
  53.  
  54. IMPORT SBYTE               page;
  55. IMPORT TEXT                aslresult[MEDFIELD + 1],
  56.                            IOBuffer[LONGESTFIELD + 1],
  57.                            string[VLONGFIELD + 1];
  58. IMPORT ULONG               offset;
  59.  
  60. AGLOBAL void autodoc1(void)
  61. {   struct Hook Hook4Struct;
  62.  
  63.     /* Create the window object. */
  64.     lockscreen();
  65.     gadtools();
  66.     InitHook(&Hook4Struct, Hook4Func, NULL);
  67.  
  68.     if (!(WinObject[4] =
  69.     NewObject
  70.     (   WINDOW_GetClass(),            NULL,
  71.         WA_PubScreen,                 ScreenPtr,
  72.         WA_ScreenTitle,               "Report+",
  73.         WA_Title,                     "Report+: Autodoc Editor (Page 1 of 2)",
  74.         WA_Activate,                  TRUE,
  75.         WA_DepthGadget,               TRUE,
  76.         WA_DragBar,                   TRUE,
  77.         WA_CloseGadget,               TRUE,
  78.         WA_SizeGadget,                TRUE,
  79.         WA_IDCMP,                     IDCMP_RAWKEY,
  80.         WINDOW_IDCMPHook,             &Hook4Struct,
  81.         WINDOW_IDCMPHookBits,         IDCMP_RAWKEY,
  82.         WINDOW_MenuStrip,             MenuPtr,
  83.         WINDOW_Position,              WPOS_CENTERSCREEN,
  84.         WINDOW_ParentGroup,           autodoc_gadgets[GID_4_LY1] =
  85.         NewObject
  86.         (   LAYOUT_GetClass(), NULL,
  87.             // root-layout
  88.             LAYOUT_Orientation,        LAYOUT_ORIENT_VERT,
  89.             LAYOUT_SpaceOuter,         TRUE,
  90.             LAYOUT_DeferLayout,        TRUE,
  91.             LAYOUT_AddChild,
  92.             NewObject
  93.             (   LAYOUT_GetClass(),     NULL,
  94.                 LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  95.                 LAYOUT_SpaceOuter,     TRUE,
  96.                 LAYOUT_VertAlignment,  LALIGN_CENTER,
  97.                 LAYOUT_HorizAlignment, LALIGN_CENTER,
  98.                 LAYOUT_BevelStyle,     BVS_FIELD,
  99.                 LAYOUT_AddChild,
  100.                 NewObject
  101.                 (   LAYOUT_GetClass(),     NULL,
  102.                     LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  103.                     LAYOUT_SpaceOuter,     TRUE,
  104.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  105.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  106.                     LAYOUT_BevelStyle,     BVS_NONE,
  107.                     LAYOUT_AddImage,
  108.                     NewObject
  109.                     (   LABEL_GetClass(),  NULL,
  110.                         LABEL_Text,        "modulename._type:",
  111.                         LABEL_Justification,LJ_LEFT,
  112.                     TAG_END),
  113.                     CHILD_WeightedWidth,   0,
  114.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST1] =
  115.                     NewObject
  116.                     (   STRING_GetClass(), NULL,
  117.                         GA_ID,             GID_4_ST1,
  118.                         GA_RelVerify,      TRUE,
  119.                         GA_TabCycle,       TRUE,
  120.                         STRINGA_TextVal,   autodoc.library,
  121.                         STRINGA_MinVisible,15,
  122.                         STRINGA_MaxChars,  MEDFIELD,
  123.                     TAG_END),
  124.                     CHILD_WeightedWidth,   50,
  125.                     LAYOUT_AddImage,
  126.                     NewObject
  127.                     (   LABEL_GetClass(),  NULL,
  128.                         LABEL_Text,        "Minimum _version:",
  129.                         LABEL_Justification,LJ_LEFT,
  130.                     TAG_END),
  131.                     CHILD_WeightedWidth,   0,
  132.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_IN1] =
  133.                     NewObject
  134.                     (   INTEGER_GetClass(),   NULL,
  135.                         GA_ID,                GID_4_IN1,
  136.                         GA_RelVerify,         TRUE,
  137.                         GA_TabCycle,          TRUE,
  138.                         INTEGER_Number,       autodoc.version,
  139.                         INTEGER_Minimum,      0, // ULONG (maximum value is (2^32) - 1)
  140.                         INTEGER_MinVisible,   5,
  141.                         TAG_END
  142.                     ),                                      
  143.                     CHILD_WeightedWidth,      50,
  144.                 TAG_END),
  145.                 CHILD_WeightedHeight,      0,
  146.                 LAYOUT_AddChild,
  147.                 NewObject
  148.                 (   LAYOUT_GetClass(),     NULL,
  149.                     LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  150.                     LAYOUT_SpaceOuter,     TRUE,
  151.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  152.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  153.                     LAYOUT_BevelStyle,     BVS_NONE,
  154.                     LAYOUT_AddImage,
  155.                     NewObject
  156.                     (   LABEL_GetClass(),  NULL,
  157.                         LABEL_Text,        "Function_Name:",
  158.                         LABEL_Justification,LJ_LEFT,
  159.                     TAG_END),
  160.                     CHILD_WeightedWidth,   0,
  161.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST2] =
  162.                     NewObject
  163.                     (   STRING_GetClass(), NULL,
  164.                         GA_ID,             GID_4_ST2,
  165.                         GA_RelVerify,      TRUE,
  166.                         GA_TabCycle,       TRUE,
  167.                         STRINGA_TextVal,   autodoc.funcname,
  168.                         STRINGA_MinVisible,35,
  169.                         STRINGA_MaxChars,  MEDFIELD,
  170.                     TAG_END),
  171.                     CHILD_WeightedWidth,   100,
  172.                 TAG_END),
  173.                 CHILD_WeightedHeight,      0,
  174.                 LAYOUT_AddChild,
  175.                 NewObject
  176.                 (   LAYOUT_GetClass(),     NULL,
  177.                     LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  178.                     LAYOUT_SpaceOuter,     TRUE,
  179.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  180.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  181.                     LAYOUT_BevelStyle,     BVS_NONE,
  182.                     LAYOUT_AddImage,
  183.                     NewObject
  184.                     (   LABEL_GetClass(),  NULL,
  185.                         LABEL_Text,        "_Description:",
  186.                         LABEL_Justification,LJ_LEFT,
  187.                     TAG_END),
  188.                     CHILD_WeightedWidth,   0,
  189.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST3] =
  190.                     NewObject
  191.                     (   STRING_GetClass(), NULL,
  192.                         GA_ID,             GID_4_ST3,
  193.                         GA_RelVerify,      TRUE,
  194.                         GA_TabCycle,       TRUE,
  195.                         STRINGA_TextVal,   autodoc.description,
  196.                         STRINGA_MinVisible,35,
  197.                         STRINGA_MaxChars,  VLONGFIELD,
  198.                     TAG_END),
  199.                     CHILD_WeightedWidth,   100,
  200.                 TAG_END),
  201.                 CHILD_WeightedHeight,      0,
  202.             TAG_END),
  203.             CHILD_WeightedHeight,          0,
  204.  
  205.             LAYOUT_AddChild,
  206.             NewObject
  207.             (   LAYOUT_GetClass(),     NULL,
  208.                 LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ,
  209.                 LAYOUT_SpaceOuter,     TRUE,
  210.                 LAYOUT_VertAlignment,  LALIGN_LEFT,
  211.                 LAYOUT_HorizAlignment, LALIGN_RIGHT,
  212.                 LAYOUT_BevelStyle,     BVS_NONE,
  213.                 LAYOUT_AddChild,
  214.                 NewObject
  215.                 (   LAYOUT_GetClass(),     NULL,
  216.                     LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  217.                     LAYOUT_SpaceOuter,     TRUE,
  218.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  219.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  220.                     LAYOUT_BevelStyle,     BVS_NONE,
  221.                     LAYOUT_AddImage,
  222.                     NewObject
  223.                     (   LABEL_GetClass(),  NULL,
  224.                         LABEL_Text,        "",
  225.                         LABEL_Justification,LJ_CENTER,
  226.                     TAG_END),
  227.                     LAYOUT_AddImage,
  228.                     NewObject
  229.                     (   LABEL_GetClass(),  NULL,
  230.                         LABEL_Text,        "_Return code:",
  231.                         LABEL_Justification,LJ_CENTER,
  232.                     TAG_END),
  233.                     LAYOUT_AddImage,
  234.                     NewObject
  235.                     (   LABEL_GetClass(),  NULL,
  236.                         LABEL_Text,        "Argument _1:",
  237.                         LABEL_Justification,LJ_CENTER,
  238.                     TAG_END),
  239.                     LAYOUT_AddImage,
  240.                     NewObject
  241.                     (   LABEL_GetClass(),  NULL,
  242.                         LABEL_Text,        "Argument _2:",
  243.                         LABEL_Justification,LJ_CENTER,
  244.                     TAG_END),
  245.                     LAYOUT_AddImage,
  246.                     NewObject
  247.                     (   LABEL_GetClass(),  NULL,
  248.                         LABEL_Text,        "Argument _3:",
  249.                         LABEL_Justification,LJ_CENTER,
  250.                     TAG_END),
  251.                     LAYOUT_AddImage,
  252.                     NewObject
  253.                     (   LABEL_GetClass(),  NULL,
  254.                         LABEL_Text,        "Argument _4:",
  255.                         LABEL_Justification,LJ_CENTER,
  256.                     TAG_END),
  257.                     LAYOUT_AddImage,
  258.                     NewObject
  259.                     (   LABEL_GetClass(),  NULL,
  260.                         LABEL_Text,        "Argument _5:",
  261.                         LABEL_Justification,LJ_CENTER,
  262.                     TAG_END),
  263.                     LAYOUT_AddImage,
  264.                     NewObject
  265.                     (   LABEL_GetClass(),  NULL,
  266.                         LABEL_Text,        "Argument _6:",
  267.                         LABEL_Justification,LJ_CENTER,
  268.                     TAG_END),
  269.                     LAYOUT_AddImage,
  270.                     NewObject
  271.                     (   LABEL_GetClass(),  NULL,
  272.                         LABEL_Text,        "Argument _7:",
  273.                         LABEL_Justification,LJ_CENTER,
  274.                     TAG_END),
  275.                     LAYOUT_AddImage,
  276.                     NewObject
  277.                     (   LABEL_GetClass(),  NULL,
  278.                         LABEL_Text,        "Argument _8:",
  279.                         LABEL_Justification,LJ_CENTER,
  280.                     TAG_END),
  281.                 TAG_END),
  282.                 CHILD_WeightedWidth,       0,
  283.                 LAYOUT_AddChild,
  284.                 NewObject
  285.                 (   LAYOUT_GetClass(),     NULL,
  286.                     LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  287.                     LAYOUT_SpaceOuter,     TRUE,
  288.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  289.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  290.                     LAYOUT_BevelStyle,     BVS_NONE,
  291.                     LAYOUT_AddImage,
  292.                     NewObject
  293.                     (   LABEL_GetClass(),  NULL,
  294.                         LABEL_Text,        "Type",
  295.                         LABEL_Justification,LJ_CENTER,
  296.                     TAG_END),
  297.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST4] =
  298.                     NewObject
  299.                     (   STRING_GetClass(), NULL,
  300.                         GA_ID,             GID_4_ST4,
  301.                         GA_RelVerify,      TRUE,
  302.                         GA_TabCycle,       TRUE,
  303.                         STRINGA_TextVal,   autodoc.var[0].type,
  304.                         STRINGA_MinVisible,8,
  305.                         STRINGA_MaxChars,  MEDFIELD,
  306.                     TAG_END),
  307.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST5] =
  308.                     NewObject
  309.                     (   STRING_GetClass(), NULL,
  310.                         GA_ID,             GID_4_ST5,
  311.                         GA_RelVerify,      TRUE,
  312.                         GA_TabCycle,       TRUE,
  313.                         STRINGA_TextVal,   autodoc.var[1].type,
  314.                         STRINGA_MinVisible,8,
  315.                         STRINGA_MaxChars,  MEDFIELD,
  316.                     TAG_END),
  317.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST6] =
  318.                     NewObject
  319.                     (   STRING_GetClass(), NULL,
  320.                         GA_ID,             GID_4_ST6,
  321.                         GA_RelVerify,      TRUE,
  322.                         GA_TabCycle,       TRUE,
  323.                         STRINGA_TextVal,   autodoc.var[2].type,
  324.                         STRINGA_MinVisible,8,
  325.                         STRINGA_MaxChars,  MEDFIELD,
  326.                     TAG_END),
  327.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST7] =
  328.                     NewObject
  329.                     (   STRING_GetClass(), NULL,
  330.                         GA_ID,             GID_4_ST7,
  331.                         GA_RelVerify,      TRUE,
  332.                         GA_TabCycle,       TRUE,
  333.                         STRINGA_TextVal,   autodoc.var[3].type,
  334.                         STRINGA_MinVisible,8,
  335.                         STRINGA_MaxChars,  MEDFIELD,
  336.                     TAG_END),
  337.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST8] =
  338.                     NewObject
  339.                     (   STRING_GetClass(), NULL,
  340.                         GA_ID,             GID_4_ST8,
  341.                         GA_RelVerify,      TRUE,
  342.                         GA_TabCycle,       TRUE,
  343.                         STRINGA_TextVal,   autodoc.var[4].type,
  344.                         STRINGA_MinVisible,8,
  345.                         STRINGA_MaxChars,  MEDFIELD,
  346.                     TAG_END),
  347.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST9] =
  348.                     NewObject
  349.                     (   STRING_GetClass(), NULL,
  350.                         GA_ID,             GID_4_ST9,
  351.                         GA_RelVerify,      TRUE,
  352.                         GA_TabCycle,       TRUE,
  353.                         STRINGA_TextVal,   autodoc.var[5].type,
  354.                         STRINGA_MinVisible,8,
  355.                         STRINGA_MaxChars,  MEDFIELD,
  356.                     TAG_END),
  357.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST10] =
  358.                     NewObject
  359.                     (   STRING_GetClass(), NULL,
  360.                         GA_ID,             GID_4_ST10,
  361.                         GA_RelVerify,      TRUE,
  362.                         GA_TabCycle,       TRUE,
  363.                         STRINGA_TextVal,   autodoc.var[6].type,
  364.                         STRINGA_MinVisible,8,
  365.                         STRINGA_MaxChars,  MEDFIELD,
  366.                     TAG_END),
  367.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST11] =
  368.                     NewObject
  369.                     (   STRING_GetClass(), NULL,
  370.                         GA_ID,             GID_4_ST11,
  371.                         GA_RelVerify,      TRUE,
  372.                         GA_TabCycle,       TRUE,
  373.                         STRINGA_TextVal,   autodoc.var[7].type,
  374.                         STRINGA_MinVisible,8,
  375.                         STRINGA_MaxChars,  MEDFIELD,
  376.                     TAG_END),
  377.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST12] =
  378.                     NewObject
  379.                     (   STRING_GetClass(), NULL,
  380.                         GA_ID,             GID_4_ST12,
  381.                         GA_RelVerify,      TRUE,
  382.                         GA_TabCycle,       TRUE,
  383.                         STRINGA_TextVal,   autodoc.var[8].type,
  384.                         STRINGA_MinVisible,8,
  385.                         STRINGA_MaxChars,  MEDFIELD,
  386.                     TAG_END),
  387.                 TAG_END),
  388.                 CHILD_WeightedWidth,       35,
  389.                 LAYOUT_AddChild,
  390.                 NewObject
  391.                 (   LAYOUT_GetClass(),     NULL,
  392.                     LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  393.                     LAYOUT_SpaceOuter,     TRUE,
  394.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  395.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  396.                     LAYOUT_BevelStyle,     BVS_NONE,
  397.                     LAYOUT_AddImage,
  398.                     NewObject
  399.                     (   LABEL_GetClass(),  NULL,
  400.                         LABEL_Text,        "Name",
  401.                         LABEL_Justification,LJ_CENTER,
  402.                     TAG_END),
  403.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST13] =
  404.                     NewObject
  405.                     (   STRING_GetClass(), NULL,
  406.                         GA_ID,             GID_4_ST13,
  407.                         GA_RelVerify,      TRUE,
  408.                         GA_TabCycle,       TRUE,
  409.                         STRINGA_TextVal,   autodoc.var[0].name,
  410.                         STRINGA_MinVisible,8,
  411.                         STRINGA_MaxChars,  MEDFIELD,
  412.                     TAG_END),
  413.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST14] =
  414.                     NewObject
  415.                     (   STRING_GetClass(), NULL,
  416.                         GA_ID,             GID_4_ST14,
  417.                         GA_RelVerify,      TRUE,
  418.                         GA_TabCycle,       TRUE,
  419.                         STRINGA_TextVal,   autodoc.var[1].name,
  420.                         STRINGA_MinVisible,8,
  421.                         STRINGA_MaxChars,  MEDFIELD,
  422.                     TAG_END),
  423.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST15] =
  424.                     NewObject
  425.                     (   STRING_GetClass(), NULL,
  426.                         GA_ID,             GID_4_ST15,
  427.                         GA_RelVerify,      TRUE,
  428.                         GA_TabCycle,       TRUE,
  429.                         STRINGA_TextVal,   autodoc.var[2].name,
  430.                         STRINGA_MinVisible,8,
  431.                         STRINGA_MaxChars,  MEDFIELD,
  432.                     TAG_END),
  433.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST16] =
  434.                     NewObject
  435.                     (   STRING_GetClass(), NULL,
  436.                         GA_ID,             GID_4_ST16,
  437.                         GA_RelVerify,      TRUE,
  438.                         GA_TabCycle,       TRUE,
  439.                         STRINGA_TextVal,   autodoc.var[3].name,
  440.                         STRINGA_MinVisible,8,
  441.                         STRINGA_MaxChars,  MEDFIELD,
  442.                     TAG_END),
  443.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST17] =
  444.                     NewObject
  445.                     (   STRING_GetClass(), NULL,
  446.                         GA_ID,             GID_4_ST17,
  447.                         GA_RelVerify,      TRUE,
  448.                         GA_TabCycle,       TRUE,
  449.                         STRINGA_TextVal,   autodoc.var[4].name,
  450.                         STRINGA_MinVisible,8,
  451.                         STRINGA_MaxChars,  MEDFIELD,
  452.                     TAG_END),
  453.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST18] =
  454.                     NewObject
  455.                     (   STRING_GetClass(), NULL,
  456.                         GA_ID,             GID_4_ST18,
  457.                         GA_RelVerify,      TRUE,
  458.                         GA_TabCycle,       TRUE,
  459.                         STRINGA_TextVal,   autodoc.var[5].name,
  460.                         STRINGA_MinVisible,8,
  461.                         STRINGA_MaxChars,  MEDFIELD,
  462.                     TAG_END),
  463.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST19] =
  464.                     NewObject
  465.                     (   STRING_GetClass(), NULL,
  466.                         GA_ID,             GID_4_ST19,
  467.                         GA_RelVerify,      TRUE,
  468.                         GA_TabCycle,       TRUE,
  469.                         STRINGA_TextVal,   autodoc.var[6].name,
  470.                         STRINGA_MinVisible,8,
  471.                         STRINGA_MaxChars,  MEDFIELD,
  472.                     TAG_END),
  473.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST20] =
  474.                     NewObject
  475.                     (   STRING_GetClass(), NULL,
  476.                         GA_ID,             GID_4_ST20,
  477.                         GA_RelVerify,      TRUE,
  478.                         GA_TabCycle,       TRUE,
  479.                         STRINGA_TextVal,   autodoc.var[7].name,
  480.                         STRINGA_MinVisible,8,
  481.                         STRINGA_MaxChars,  MEDFIELD,
  482.                     TAG_END),
  483.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST21] =
  484.                     NewObject
  485.                     (   STRING_GetClass(), NULL,
  486.                         GA_ID,             GID_4_ST21,
  487.                         GA_RelVerify,      TRUE,
  488.                         GA_TabCycle,       TRUE,
  489.                         STRINGA_TextVal,   autodoc.var[8].name,
  490.                         STRINGA_MinVisible,8,
  491.                         STRINGA_MaxChars,  MEDFIELD,
  492.                     TAG_END),
  493.                 TAG_END),
  494.                 CHILD_WeightedWidth,       50,
  495.                 LAYOUT_AddChild,
  496.                 NewObject
  497.                 (   LAYOUT_GetClass(),     NULL,
  498.                     LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  499.                     LAYOUT_SpaceOuter,     TRUE,
  500.                     LAYOUT_VertAlignment,  LALIGN_CENTER,
  501.                     LAYOUT_HorizAlignment, LALIGN_CENTER,
  502.                     LAYOUT_BevelStyle,     BVS_NONE,
  503.                     LAYOUT_AddImage,
  504.                     NewObject
  505.                     (   LABEL_GetClass(),  NULL,
  506.                         LABEL_Text,        "Register",
  507.                         LABEL_Justification,LJ_CENTER,
  508.                     TAG_END),
  509.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST22] =
  510.                     NewObject
  511.                     (   STRING_GetClass(), NULL,
  512.                         GA_ID,             GID_4_ST22,
  513.                         GA_RelVerify,      TRUE,
  514.                         GA_TabCycle,       TRUE,
  515.                         STRINGA_TextVal,   autodoc.var[0].reg,
  516.                         STRINGA_MinVisible,8,
  517.                         STRINGA_MaxChars,  MEDFIELD,
  518.                     TAG_END),
  519.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST23] =
  520.                     NewObject
  521.                     (   STRING_GetClass(), NULL,
  522.                         GA_ID,             GID_4_ST23,
  523.                         GA_RelVerify,      TRUE,
  524.                         GA_TabCycle,       TRUE,
  525.                         STRINGA_TextVal,   autodoc.var[1].reg,
  526.                         STRINGA_MinVisible,8,
  527.                         STRINGA_MaxChars,  MEDFIELD,
  528.                     TAG_END),
  529.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST24] =
  530.                     NewObject
  531.                     (   STRING_GetClass(), NULL,
  532.                         GA_ID,             GID_4_ST24,
  533.                         GA_RelVerify,      TRUE,
  534.                         GA_TabCycle,       TRUE,
  535.                         STRINGA_TextVal,   autodoc.var[2].reg,
  536.                         STRINGA_MinVisible,8,
  537.                         STRINGA_MaxChars,  MEDFIELD,
  538.                     TAG_END),
  539.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST25] =
  540.                     NewObject
  541.                     (   STRING_GetClass(), NULL,
  542.                         GA_ID,             GID_4_ST25,
  543.                         GA_RelVerify,      TRUE,
  544.                         GA_TabCycle,       TRUE,
  545.                         STRINGA_TextVal,   autodoc.var[3].reg,
  546.                         STRINGA_MinVisible,8,
  547.                         STRINGA_MaxChars,  MEDFIELD,
  548.                     TAG_END),
  549.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST26] =
  550.                     NewObject
  551.                     (   STRING_GetClass(), NULL,
  552.                         GA_ID,             GID_4_ST26,
  553.                         GA_RelVerify,      TRUE,
  554.                         GA_TabCycle,       TRUE,
  555.                         STRINGA_TextVal,   autodoc.var[4].reg,
  556.                         STRINGA_MinVisible,8,
  557.                         STRINGA_MaxChars,  MEDFIELD,
  558.                     TAG_END),
  559.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST27] =
  560.                     NewObject
  561.                     (   STRING_GetClass(), NULL,
  562.                         GA_ID,             GID_4_ST27,
  563.                         GA_RelVerify,      TRUE,
  564.                         GA_TabCycle,       TRUE,
  565.                         STRINGA_TextVal,   autodoc.var[5].reg,
  566.                         STRINGA_MinVisible,8,
  567.                         STRINGA_MaxChars,  MEDFIELD,
  568.                     TAG_END),
  569.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST28] =
  570.                     NewObject
  571.                     (   STRING_GetClass(), NULL,
  572.                         GA_ID,             GID_4_ST28,
  573.                         GA_RelVerify,      TRUE,
  574.                         GA_TabCycle,       TRUE,
  575.                         STRINGA_TextVal,   autodoc.var[6].reg,
  576.                         STRINGA_MinVisible,8,
  577.                         STRINGA_MaxChars,  MEDFIELD,
  578.                     TAG_END),
  579.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST29] =
  580.                     NewObject
  581.                     (   STRING_GetClass(), NULL,
  582.                         GA_ID,             GID_4_ST29,
  583.                         GA_RelVerify,      TRUE,
  584.                         GA_TabCycle,       TRUE,
  585.                         STRINGA_TextVal,   autodoc.var[7].reg,
  586.                         STRINGA_MinVisible,8,
  587.                         STRINGA_MaxChars,  MEDFIELD,
  588.                     TAG_END),
  589.                     LAYOUT_AddChild,       autodoc_gadgets[GID_4_ST30] =
  590.                     NewObject
  591.                     (   STRING_GetClass(), NULL,
  592.                         GA_ID,             GID_4_ST30,
  593.                         GA_RelVerify,      TRUE,
  594.                         GA_TabCycle,       TRUE,
  595.                         STRINGA_TextVal,   autodoc.var[8].reg,
  596.                         STRINGA_MinVisible,8,
  597.                         STRINGA_MaxChars,  MEDFIELD,
  598.                     TAG_END),
  599.                 TAG_END),
  600.                 CHILD_WeightedWidth,       15,
  601.             TAG_END),
  602.             CHILD_WeightedHeight,      0,
  603.             LAYOUT_AddChild,
  604.             NewObject
  605.             (   LAYOUT_GetClass(),     NULL,
  606.                 LAYOUT_Orientation,    LAYOUT_ORIENT_VERT,
  607.                 LAYOUT_SpaceOuter,     TRUE,
  608.                 LAYOUT_VertAlignment,  LALIGN_CENTER,
  609.                 LAYOUT_HorizAlignment, LALIGN_CENTER,
  610.                 LAYOUT_BevelStyle,     BVS_FIELD,
  611.                 LAYOUT_AddChild,          autodoc_gadgets[GID_4_BU1] =
  612.                 NewObject
  613.                 (   NULL,                 "button.gadget",
  614.                     // button
  615.                     GA_ID,                GID_4_BU1,
  616.                     GA_RelVerify,         TRUE,
  617.                     GA_Text,              "_Other page",
  618.                 TAG_END),
  619.                 CHILD_WeightedHeight,     0,
  620.                 LAYOUT_AddChild,          autodoc_gadgets[GID_4_BU2] =
  621.                 NewObject
  622.                 (   NULL,                 "button.gadget",
  623.                     // button
  624.                     GA_ID,                GID_4_BU2,
  625.                     GA_RelVerify,         TRUE,
  626.                     GA_Text,              "Menu",
  627.                 TAG_END),
  628.                 CHILD_WeightedHeight,     0,
  629.             TAG_END),
  630.             CHILD_WeightedHeight,         0,
  631.         TAG_END
  632.     ))))
  633.     {   rq("Can't create ReAction objects!");
  634.     }
  635.     unlockscreen();
  636.     openwindow();
  637.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_NEW,    NOSUB));
  638.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_OPEN,   NOSUB));
  639.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVE,   NOSUB));
  640.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVEAS, NOSUB));
  641.     ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_ST1]);
  642.  
  643.     loop();
  644.     closewindow();
  645. }
  646.  
  647. AGLOBAL void saveautodoc(ABOOL saveas)
  648. {   ULONG i, j;
  649.     TEXT  temp[MEDFIELD + 1];
  650.     SWORD size;
  651.  
  652.     readautodocgadgets();
  653.    
  654.     strcpy(IOBuffer, "/" "****** ");        //  1:  "/###### "
  655.     strcat(IOBuffer, autodoc.library);      //  1:  "/###### <library>"
  656.     strcat(IOBuffer, "/");                  //  1:  "/###### <library>/"
  657.     strcat(IOBuffer, autodoc.funcname);     //  1:  "/###### <library>/<funcname>"
  658.     strcat(IOBuffer, " ");                  //  1:  "/###### <library>/<funcname> "
  659.  
  660.     size = 67 - strlen(autodoc.library) - strlen(autodoc.funcname);
  661.     if (size > 0)
  662.     {   for (i = 1; i <= size; i++)           
  663.             strcat(IOBuffer, "*");          //  1:  "/###### <library>/<funcname> <stars>"
  664.     }
  665.  
  666.     strcat(IOBuffer, "\n*\n*   NAME\n*   ");
  667.                                             //  1:  "/###### <library>/<funcname> <stars>\n"
  668.                                             //  2:  "#\n"
  669.                                             //  3:  "#   NAME\n"
  670.                                             //  4:  "#   "
  671.     strcat(IOBuffer, autodoc.funcname);     //  4:  "#   <funcname>"
  672.     strcat(IOBuffer, " -- ");               //  4:  "#   <funcname> -- "
  673.     strcat(IOBuffer, autodoc.description);
  674.                                             //  4:  "#   <funcname> -- <description>"
  675.     if (autodoc.version)
  676.     {   strcat(IOBuffer, " (V");            //  4:  "#   <funcname> -- <description>[ (V]"
  677.         stcl_d(temp, autodoc.version);
  678.         strcat(IOBuffer, temp);             //  4:  "#   <funcname> -- <description>[ (V<version>]"
  679.         strcat(IOBuffer, ")");              //  4:  "#   <funcname> -- <description>[ (V<version>)]
  680.     }
  681.     strcat(IOBuffer, "\n*\n*   SYNOPSIS\n");
  682.                                             //  4:  "#   <funcname> -- <description>[ (V<version>)]\n"
  683.                                             //  5:  "#\n"
  684.                                             //  6:  "#   SYNOPSIS\n"
  685.  
  686.     // name line
  687.     strcat(IOBuffer, "*   ");               //  7:  "#   "
  688.     if (autodoc.var[0].name[0])
  689.     {   strcat(IOBuffer, autodoc.var[0].name);
  690.                                             //  7:  "#   [<returnname>]"
  691.         strcat(IOBuffer, " = ");            //  7:  "#   [<returnname> = ]"
  692.     }
  693.     strcat(IOBuffer, autodoc.funcname);     //  7:  "#   [<returnname> = ]<funcname>"
  694.     strcat(IOBuffer, "(");                  //  7:  "#   [<returnname> = ]<funcname>("
  695.  
  696.     for (i = 1; i <= 8; i++)
  697.     {   if (autodoc.var[i].name[0])
  698.         {   if (i >= 2)
  699.                 strcat(IOBuffer, ", ");
  700.             strcat(IOBuffer, autodoc.var[i].name);
  701.             size = strlen(autodoc.var[i].reg) - strlen(autodoc.var[i].name);
  702.             if (size > 0)
  703.                 for (j = 1; j <= size; j++)
  704.                     strcat(IOBuffer, " ");
  705.         } else break;
  706.     }
  707.     strcat(IOBuffer, ")\n");                //  7:  "#   [<returnname> = ]<funcname>([<arglist>])\n"
  708.  
  709.     // register line
  710.     strcat(IOBuffer, "*   ");               //  8:  "#   "
  711.     if (autodoc.var[0].reg[0] && autodoc.var[0].name[0])
  712.     {   strcat(IOBuffer, autodoc.var[0].reg);
  713.                                             //  8:  "#   [<returnreg>]"
  714.         size = strlen(autodoc.var[0].name) - strlen(autodoc.var[0].reg);
  715.         if (size > 0)
  716.             for (i = 1; i <= size; i++)
  717.                 strcat(IOBuffer, " ");      //  8:  "#   [<returnreg><spaces>]"
  718.         strcat(IOBuffer, "   ");            //  8:  "#   [<returnreg><spaces>   ]"
  719.     }
  720.     size = strlen(autodoc.funcname);
  721.     if (size >= 0) // this is no mistake
  722.         for (i = 0; i <= size; i++)
  723.             strcat(IOBuffer, " ");          //  8:  "#   [<returnreg><spaces>   ]<spaces>"
  724.  
  725.     for (i = 1; i <= 8; i++)
  726.     {   if (autodoc.var[i].reg[0])
  727.         {   if (i >= 2)
  728.                 strcat(IOBuffer, "  ");
  729.             strcat(IOBuffer, autodoc.var[i].reg);
  730.             size = strlen(autodoc.var[i].name) - strlen(autodoc.var[i].reg);
  731.             if (size > 0)
  732.                 for (j = 1; j <= size; j++)
  733.                     strcat(IOBuffer, " ");
  734.     }   }
  735.     strcat(IOBuffer, "\n");                 //  8:  "#   [<returnreg><spaces>   ]<spaces>[<reglist>]\n"
  736.  
  737.     strcat(IOBuffer, "*\n*   ");            //  9:  "#\n"
  738.                                             // 10:  "#   "
  739.     if (autodoc.var[0].type[0])
  740.     {   strcat(IOBuffer, autodoc.var[0].type);
  741.                                             // 10a: "#   <returntype>"
  742.         strcat(IOBuffer, " ");              // 10a: "#   <returntype> "
  743.     } else
  744.         strcat(IOBuffer, "void ");          // 10b: "#   void "
  745.     strcat(IOBuffer, autodoc.funcname);     // 10:  "#   <returntype>|void <funcname>"
  746.     strcat(IOBuffer, "(");                  // 10:  "#   <returntype>|void <funcname>("
  747.     if (!(autodoc.var[1].type))             // 10:  "#   <returntype>|void <funcname>([void]"
  748.         strcat(IOBuffer, "void");
  749.     else
  750.     {   for (i = 1; i <= 8; i++)
  751.         {   if (autodoc.var[i].type[0])
  752.             {   if (i >= 2)
  753.                     strcat(IOBuffer, ", ");
  754.                 strcat(IOBuffer, autodoc.var[i].type);
  755.             } else break;
  756.     }   }
  757.     strcat(IOBuffer, ");\n*\n*   FUNCTION\n*   ");
  758.                                             // 10:  "#   <returntype>|void <funcname>(void|<typelist>);\n"
  759.                                             // 11:  "#\n"
  760.                                             // 12:  "#   FUNCTION\n"
  761.                                             // 13:  "#   "
  762.     starify(autodoc.function);
  763.     strcat(IOBuffer, StarBufferPtr);        // 13:  "#   <buffer>"
  764.     FreeVec(StarBufferPtr);
  765.  
  766.     strcat(IOBuffer, "\n*\n*   INPUTS\n");  // 13:  "#   <buffer>\n"
  767.                                             // 14:  "#\n"
  768.                                             // 15:  "#   INPUTS\n"
  769.  
  770.     bizarre();
  771.  
  772.     strcat(IOBuffer, "*\n*   RESULT\n*   ");
  773.                                             // 17:  "#\n"
  774.                                             // 18:  "#   RESULT\n"
  775.                                             // 19:  "#   "
  776.     if (!(autodoc.var[0].name[0]))
  777.     {   strcat(IOBuffer, "NONE");           // 19a: "#   NONE"
  778.     } else
  779.     {   strcat(IOBuffer, autodoc.var[0].name);
  780.                                             // 19b: "#   <returnname>"
  781.         strcat(IOBuffer, " - ");            // 19b: "#   <returnname> - "
  782.  
  783.         starify(autodoc.var[0].desc);
  784.         strcat(IOBuffer, StarBufferPtr);    // 19b: "#   <returnname> - <buffer>"
  785.         FreeVec(StarBufferPtr);
  786.     }
  787.  
  788.     strcat
  789.     (   IOBuffer,
  790.         "\n*\n"                             // 19a: "#   NONE\n"
  791.                                             // 19b: "#   <returnname> - <buffer>\n"
  792.                                             // 20:  "#\n"
  793.         "*   EXAMPLE\n*   "                 // 21:  "#   EXAMPLE\n"
  794.                                             // 22:  "#   "
  795.     );
  796.  
  797.     starify(autodoc.example);
  798.     strcat(IOBuffer, StarBufferPtr);        // 22:  "#   <buffer>"
  799.     FreeVec(StarBufferPtr);
  800.     strcat(IOBuffer, "\n*\n*   NOTES\n*   ");
  801.                                             // 22:  "#   <buffer>\n"
  802.                                             // 23:  "#\n"
  803.                                             // 24:  "#   NOTES\n"
  804.                                             // 25:  "#   "
  805.     starify(autodoc.notes);
  806.     strcat(IOBuffer, StarBufferPtr);        // 25:  "#   <buffer>"
  807.     FreeVec(StarBufferPtr);
  808.     strcat(IOBuffer, "\n*\n*   BUGS\n*   ");
  809.                                             // 25:  "#   <buffer>\n"
  810.                                             // 26:  "#\n"
  811.                                             // 27:  "#   BUGS\n"
  812.                                             // 28:  "#   "
  813.     starify(autodoc.bugs);
  814.     strcat(IOBuffer, StarBufferPtr);        // 28:  "#   <buffer>"
  815.     FreeVec(StarBufferPtr);
  816.     strcat(IOBuffer, "\n*\n*   SEE ALSO\n*   ");
  817.                                             // 28:  "#   <buffer>\n"
  818.                                             // 29:  "#\n"
  819.                                             // 30:  "#   SEE ALSO\n"
  820.                                             // 31:  "#   "
  821.     starify(autodoc.seealso);
  822.     strcat(IOBuffer, StarBufferPtr);        // 31:  "#   <buffer>"
  823.     FreeVec(StarBufferPtr);
  824.  
  825.     strcat
  826.     (   IOBuffer,
  827.         "\n*\n"                             // 31:  "#   <buffer>\n"
  828.                                             // 32:  "#\n"
  829.         "*****************************************************************************\n"
  830.                                             // 33:  "<77 stars>\n"
  831.         "*\n*"                              // 34:  "#\n"
  832.                                             // 35:  "#"
  833.         "/\n"                               // 35:  "#/\n"
  834.     );
  835.  
  836.     if (!autodoc.output[0] || saveas) // if we need a filename
  837.     {   if (saveasl("Save Autodoc", "#?.c"))
  838.         {   strcpy(autodoc.output, aslresult);
  839.             writeout(autodoc.output);
  840.     }   }
  841.     else
  842.     {   writeout(autodoc.output);
  843. }   }
  844.  
  845. MODULE void bizarre(void)
  846. {   ULONG i, j;
  847.     SWORD size, longest = 0, thislength; // must be signed
  848.     TEXT  line[VLONGFIELD + 1]; // better not make it too large, as it is
  849.                                 // a local (stack) variable.
  850.  
  851.     numberofinputs();
  852.     if (!inputs)
  853.     {   strcpy(line, "*   NONE\n");         // 16:  "#   NONE\n"
  854.     } else
  855.     {   for (i = 1; i <= inputs; i++)
  856.         {   thislength = strlen(autodoc.var[i].name);
  857.             if (thislength > longest)
  858.             {   longest = thislength;
  859.         }   }
  860.  
  861.         for (i = 1; i <= inputs; i++)
  862.         {   strcpy(line, "*   ");           // 16:  "#   "
  863.             strcat(line, autodoc.var[i].name);
  864.                                             // 16:  "#   <argname1>"
  865.             thislength = strlen(autodoc.var[i].name);
  866.             size = longest - thislength;
  867.             if (size > 0)
  868.             {   for (j = 1; j <= size; j++)
  869.                 {    strcat(line, " ");     // 16:  "#   <argname1><spaces>"
  870.             }   }
  871.             strcat(line, " - ");            // 16:  "#   <argname1><spaces> - "
  872.  
  873.             starify(autodoc.var[i].desc);
  874.             strcat(line, StarBufferPtr);
  875.             FreeVec(StarBufferPtr);                     // 16:  "#   <argname1><spaces> - <buffer1>"
  876.             strcat(line, "\n");             // 16:  "#   <argname1><spaces> - <buffer1>\n"
  877.             strcat(IOBuffer, line);
  878. }   }   }
  879.  
  880. AGLOBAL void newautodoc(ABOOL display)
  881. {   ULONG i;
  882.  
  883.     autodoc.version        = 0;
  884.     autodoc.library[0]     = 0;
  885.     autodoc.funcname[0]    = 0;
  886.     autodoc.description[0] = 0;
  887.     for (i = 0; i <= 8; i++)
  888.     {   autodoc.var[i].name[0] = 0;
  889.         autodoc.var[i].type[0] = 0;
  890.         autodoc.var[i].reg[0]  = 0;
  891.         autodoc.var[i].desc[0] = 0;
  892.     }
  893.     autodoc.output[0]   = 0;
  894.     autodoc.function[0] = 0;
  895.     autodoc.example[0]  = 0;
  896.     autodoc.notes[0]    = 0;
  897.     autodoc.bugs[0]     = 0;
  898.     autodoc.seealso[0]  = 0;
  899.  
  900.     if (display)
  901.     {   updateautodocgadgets();
  902. }   }
  903.  
  904. AGLOBAL void openautodoc(void)
  905. {   if (asl("~(#?.info)"))
  906.     {   newautodoc(FALSE); // This line and the next are order-dependant
  907.         strcpy(autodoc.output, aslresult);
  908.         loadautodoc();
  909.         updateautodocgadgets();
  910. }   }
  911.  
  912. AGLOBAL void loadautodoc(void)
  913. {   ULONG counter, i, whatfound;
  914.  
  915.     /* parse() returns when it has moved along and found the specified
  916.        `ending string'. The contents, since last parse(), before the
  917.        `ending string' are returned in string. */
  918.  
  919.     if (readin(autodoc.output))
  920.     {   offset = 0;
  921.         parse("/" "****** "); // skip header
  922.  
  923.         // name
  924.         parse("/");
  925.         strcpy(autodoc.library, string);
  926.         parse(" ");
  927.         strcpy(autodoc.funcname, string);
  928.         parse("\n*\n*   NAME\n*   "); 
  929.  
  930.         // ignore that, skip all the asterisks
  931.         parse(" -- ");
  932.         // function name is repeated here
  933.         if (parseeither(" (V", "\n*\n*   SYNOPSIS\n*   ") == 1)
  934.         {   strcpy(autodoc.description, string);
  935.             parse(")\n*\n*   SYNOPSIS\n*   ");
  936.             autodoc.version = atol(string);
  937.         } else
  938.         {   strcpy(autodoc.description, string);
  939.         }
  940.  
  941.         // synopsis
  942.         if (parseeither(" = ", "(") == 1)
  943.         {   strcpy(autodoc.var[0].name, string);
  944.             parse("(");
  945.         }
  946.         // function name is repeated here
  947.         counter = 0;
  948.         while (whatfound = parseeither(", ", ")\n*   "))
  949.         {   if (string[0]) // in case we get () situation (ie. no args)
  950.             {   counter++;
  951.                 strcpy(autodoc.var[counter].name, string);
  952.             }
  953.             if (whatfound == 2)
  954.             {   break;
  955.         }   }
  956.         inputs = counter;
  957.         if (autodoc.var[0].name[0])
  958.         {   counter = 0;
  959.         } else counter = 1; // where to start
  960.         while (whatfound = parseeither(" ", "\n*\n*   "))
  961.         {   if (string[0])
  962.             {   strcpy(autodoc.var[counter].reg, string);
  963.                 counter++;
  964.             }
  965.             if (whatfound == 2)
  966.             {   break;
  967.         }   }
  968.         parse(" ");
  969.         strcpy(autodoc.var[0].type, string);
  970.         parse("(");
  971.         // function name is repeated here
  972.         counter = 0;
  973.         while (whatfound = parseeither(", ", ");\n*\n*   FUNCTION\n*   "))
  974.         {   if (string[0]) // in case we get () situation (ie. no args)
  975.             {   counter++;
  976.                 strcpy(autodoc.var[counter].type, string);
  977.             }
  978.             if (whatfound == 2)
  979.             {   break;
  980.         }   }
  981.         // function
  982.         parse("\n*\n*   INPUTS\n*   ");
  983.         destarify(string);
  984.         strcpy(autodoc.function, StarBufferPtr);
  985.         FreeVec(StarBufferPtr);
  986.  
  987.         // inputs
  988.         for (i = 1; i <= inputs; i++)
  989.         {   parse("   ");
  990.             parse(" -");
  991.             // input name is repeated here
  992.             if (parseeither(" ", "\n*") == 1)
  993.             {   parse("\n*");
  994.                 destarify(string);
  995.                 strcpy(autodoc.var[counter].desc, StarBufferPtr);
  996.                 FreeVec(StarBufferPtr);
  997.         }   } 
  998.         parse("\n*   RESULT\n*   ");
  999.  
  1000.         // result
  1001.         if (parseeither(" - ", "NONE\n*\n*   EXAMPLE\n*   ") == 1)
  1002.         {   strcpy(autodoc.var[0].name, string);
  1003.             parse("\n*\n*   EXAMPLE");
  1004.             destarify(string);
  1005.             strcpy(autodoc.var[0].desc, StarBufferPtr);
  1006.             FreeVec(StarBufferPtr);
  1007.             parseeither("\n*   ", "S\n*   "); // accepts either EXAMPLE or EXAMPLES
  1008.         }
  1009.  
  1010.         // example
  1011.         parse("\n*\n*   NOTES\n*   ");
  1012.         destarify(string);
  1013.         strcpy(autodoc.example, StarBufferPtr);
  1014.         FreeVec(StarBufferPtr);
  1015.  
  1016.         // notes
  1017.         parse("\n*\n*   BUGS\n*   ");
  1018.         destarify(string);
  1019.         strcpy(autodoc.notes, StarBufferPtr);
  1020.         FreeVec(StarBufferPtr);
  1021.  
  1022.         // bugs
  1023.         parse("\n*\n*   SEE ALSO\n*   ");
  1024.         destarify(string);
  1025.         strcpy(autodoc.bugs, StarBufferPtr);
  1026.         FreeVec(StarBufferPtr);
  1027.  
  1028.         // see also
  1029.         parse("\n*\n*****************************************************************************\n*\n*" "/" "\n");
  1030.         destarify(string);
  1031.         strcpy(autodoc.seealso, StarBufferPtr);
  1032.         FreeVec(StarBufferPtr);
  1033. }   }
  1034.  
  1035. AGLOBAL void autodoc_init(void)
  1036. {   newautodoc(FALSE);
  1037. }
  1038.  
  1039. AGLOBAL void autodoc_loop(ULONG gid)
  1040. {   STRPTR stringptr;
  1041.  
  1042.     switch(gid)
  1043.     {
  1044.     case GID_4_ST1:
  1045.         if (!(GetAttr
  1046.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST1], (ULONG *) &stringptr
  1047.         )))
  1048.         {   rq("Unsupported inquiry!"); // should never happen
  1049.         }
  1050.         strcpy(autodoc.library, stringptr);
  1051.     break;
  1052.     case GID_4_ST2:
  1053.         if (!(GetAttr
  1054.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST2], (ULONG *) &stringptr
  1055.         )))
  1056.         {   rq("Unsupported inquiry!"); // should never happen
  1057.         }
  1058.         strcpy(autodoc.funcname, stringptr);
  1059.     break;
  1060.     case GID_4_ST3:
  1061.         if (!(GetAttr
  1062.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST3], (ULONG *) &stringptr
  1063.         )))
  1064.         {   rq("Unsupported inquiry!"); // should never happen
  1065.         }
  1066.         strcpy(autodoc.description, stringptr);
  1067.     break;
  1068.     case GID_4_IN1:
  1069.         if (!(GetAttr
  1070.         (   INTEGER_Number, autodoc_gadgets[GID_4_IN1], (ULONG *) &autodoc.version
  1071.         )))
  1072.         {   rq("Unsupported inquiry!"); // should never happen
  1073.         }
  1074.     break;
  1075.     case GID_4_BU1:
  1076.         readautodocgadgets();
  1077.         numberofinputs();
  1078.         page = 42;
  1079.     break;
  1080.     case GID_4_BU2:
  1081.     case GID_4_BU4:
  1082.         page = 0;
  1083.     break;
  1084.     case GID_4_BU3:
  1085.         readautodocgadgets();
  1086.         page = 41;
  1087.     break;
  1088.     default:
  1089.         if (gid >= GID_4_ST4 && gid <= GID_4_ST4 + 8)
  1090.         {   if (!(GetAttr
  1091.             (   STRINGA_TextVal, autodoc_gadgets[gid], (ULONG *) &stringptr
  1092.             )))
  1093.             {   rq("Unsupported inquiry!"); // should never happen
  1094.             }
  1095.             strcpy(autodoc.var[gid - GID_4_ST4].type, stringptr);
  1096.         } elif (gid >= GID_4_ST13 && gid <= GID_4_ST13 + 8)
  1097.         {   if (!(GetAttr
  1098.             (   STRINGA_TextVal, autodoc_gadgets[gid], (ULONG *) &stringptr
  1099.             )))
  1100.             {   rq("Unsupported inquiry!"); // should never happen
  1101.             }
  1102.             strcpy(autodoc.var[gid - GID_4_ST13].name, stringptr);
  1103.         } elif (gid >= GID_4_ST22 && gid <= GID_4_ST22 + 8)
  1104.         {   if (!(GetAttr
  1105.             (   STRINGA_TextVal, autodoc_gadgets[gid], (ULONG *) &stringptr
  1106.             )))
  1107.             {   rq("Unsupported inquiry!"); // should never happen
  1108.             }
  1109.             strcpy(autodoc.var[gid - GID_4_ST22].reg, stringptr);
  1110.         }
  1111.         break;
  1112. }   }
  1113.  
  1114. MODULE void updateautodocgadgets(void)
  1115. {   ULONG i;
  1116.  
  1117. if (page == 41)
  1118. {   SetGadgetAttrs
  1119.     (   autodoc_gadgets[GID_4_ST1], MainWindowPtr, NULL,
  1120.         STRINGA_TextVal, autodoc.library,
  1121.         TAG_END
  1122.     );
  1123.     SetGadgetAttrs
  1124.     (   autodoc_gadgets[GID_4_ST2], MainWindowPtr, NULL,
  1125.         STRINGA_TextVal, autodoc.funcname,
  1126.         TAG_END
  1127.     );
  1128.     SetGadgetAttrs
  1129.     (   autodoc_gadgets[GID_4_ST3], MainWindowPtr, NULL,
  1130.         STRINGA_TextVal, autodoc.description,
  1131.         TAG_END
  1132.     );
  1133.     SetGadgetAttrs
  1134.     (   autodoc_gadgets[GID_4_IN1], MainWindowPtr, NULL,
  1135.         INTEGER_Number, autodoc.version,
  1136.         TAG_END
  1137.     );
  1138.  
  1139.     for (i = 0; i <= 8; i++)
  1140.     {   SetGadgetAttrs
  1141.         (   autodoc_gadgets[GID_4_ST4 + i], MainWindowPtr, NULL,
  1142.             STRINGA_TextVal, autodoc.var[i].type,
  1143.             TAG_END
  1144.         );
  1145.         SetGadgetAttrs
  1146.         (   autodoc_gadgets[GID_4_ST13 + i], MainWindowPtr, NULL,
  1147.             STRINGA_TextVal, autodoc.var[i].name,
  1148.             TAG_END
  1149.         );
  1150.         SetGadgetAttrs
  1151.         (   autodoc_gadgets[GID_4_ST22 + i], MainWindowPtr, NULL,
  1152.             STRINGA_TextVal, autodoc.var[i].reg,
  1153.             TAG_END
  1154.         );
  1155. }   }
  1156. else
  1157. {   ; /* assert(page == 42);
  1158.     This should never be called, because New and Open... are only
  1159.     available from page 41. */
  1160. }
  1161. }
  1162.  
  1163. MODULE void readautodocgadgets(void)
  1164. {   ULONG  i;
  1165.     STRPTR stringptr;
  1166.     STRPTR textBuffer[MAXELEMENTS_4 + 1];
  1167.  
  1168. if (page == 41)
  1169. {   if (!(GetAttr
  1170.     (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST1], (ULONG *) &stringptr
  1171.     )))
  1172.     {   rq("Unsupported inquiry!"); // should never happen
  1173.     }
  1174.     strcpy(autodoc.library, stringptr);
  1175.  
  1176.     if (!(GetAttr
  1177.     (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST2], (ULONG *) &stringptr
  1178.     )))
  1179.     {   rq("Unsupported inquiry!"); // should never happen
  1180.     }
  1181.     strcpy(autodoc.funcname, stringptr);
  1182.  
  1183.     if (!(GetAttr
  1184.     (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST3], (ULONG *) &stringptr
  1185.     )))
  1186.     {   rq("Unsupported inquiry!"); // should never happen
  1187.     }
  1188.     strcpy(autodoc.description, stringptr);
  1189.  
  1190.     if (!(GetAttr
  1191.     (   INTEGER_Number, autodoc_gadgets[GID_4_IN1], (ULONG *) &autodoc.version
  1192.     )))
  1193.     {   rq("Unsupported inquiry!"); // should never happen
  1194.     }
  1195.  
  1196.     for (i = 0; i <= 8; i++)
  1197.     {   if (!(GetAttr
  1198.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST4 + i], (ULONG *) &stringptr
  1199.         )))
  1200.         {   rq("Unsupported inquiry!"); // should never happen
  1201.         }
  1202.         strcpy(autodoc.var[i].type, stringptr);
  1203.  
  1204.         if (!(GetAttr
  1205.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST13 + i], (ULONG *) &stringptr
  1206.         )))
  1207.         {   rq("Unsupported inquiry!"); // should never happen
  1208.         }
  1209.         strcpy(autodoc.var[i].name, stringptr);
  1210.  
  1211.         if (!(GetAttr
  1212.         (   STRINGA_TextVal, autodoc_gadgets[GID_4_ST22 + i], (ULONG *) &stringptr
  1213.         )))
  1214.         {   rq("Unsupported inquiry!"); // should never happen
  1215.         }
  1216.         strcpy(autodoc.var[i].reg, stringptr);
  1217. }   }
  1218. else
  1219. {   // assert(page == 42);
  1220.     for (i = 0; i <= elements; i++)
  1221.     {   textBuffer[i] = (STRPTR) DoGadgetMethod(autodoc_gadgets[GID_4_TE1 + i], MainWindowPtr, NULL, GM_TEXTEDITOR_ExportText, NULL);
  1222.     }
  1223.     strcpy(autodoc.function, textBuffer[0]);
  1224.     if (inputs)
  1225.     {   for (i = 1; i <= inputs; i++)
  1226.         {   strcpy(autodoc.var[i].desc, textBuffer[i]);
  1227.     }   }
  1228.     if (returncode)
  1229.     {   strcpy(autodoc.var[0].desc, textBuffer[inputs + 1]);
  1230.     }
  1231.     strcpy(autodoc.example, textBuffer[inputs + returncode + 1]);
  1232.     strcpy(autodoc.notes,   textBuffer[inputs + returncode + 2]);
  1233.     strcpy(autodoc.bugs,    textBuffer[inputs + returncode + 3]);
  1234.     strcpy(autodoc.seealso, textBuffer[inputs + returncode + 4]);
  1235.     for (i = 0; i <= elements; i++)
  1236.     {   FreeVec((APTR) textBuffer[i]);
  1237.         textBuffer[i] = NULL;
  1238. }   }
  1239. }
  1240.  
  1241. MODULE void starify(STRPTR buffer)
  1242. {   ULONG i, inputlength = 0, outputlength = 0, outputpos = 0;
  1243.     ABOOL done = FALSE;
  1244.  
  1245.     // first we count the number of LFs in the source buffer, and the
  1246.     // length of the source buffer.
  1247.     while (!done)
  1248.     {   if (*(buffer + inputlength) == LF)
  1249.             outputlength += 4;
  1250.         elif (*(buffer + inputlength) == 0)
  1251.             done = TRUE;
  1252.         outputlength++;
  1253.         inputlength++;
  1254.     }
  1255.  
  1256.     // now we allocate the buffer
  1257.     if (!(StarBufferPtr = AllocVec(outputlength, MEMF_PUBLIC)))
  1258.         rq("Out of memory!");
  1259.  
  1260.     // now we translate into new buffer
  1261.     for (i = 0; i <= inputlength; i++)
  1262.     {   *(StarBufferPtr + outputpos) = *(buffer + i);
  1263.         if (*(buffer + i) == LF)
  1264.         {   *(StarBufferPtr + outputpos + 1) = '*';
  1265.             *(StarBufferPtr + outputpos + 2) = ' ';
  1266.             *(StarBufferPtr + outputpos + 3) = ' ';
  1267.             *(StarBufferPtr + outputpos + 4) = ' ';
  1268.             outputpos += 4;
  1269.         }
  1270.         outputpos++;
  1271. }   }
  1272. MODULE void destarify(STRPTR buffer)
  1273. {   ULONG i, inputlength = 0, outputlength = 0, outputpos = 0;
  1274.     ABOOL done = FALSE;
  1275.  
  1276.     // Translates occurrences of "\n*   " to " ".
  1277.     while (!done) // first pass
  1278.     {   if (!strncmp(buffer + inputlength, "\n*   ", 5))
  1279.             outputlength -= 4; // we replace 5 bytes with 1, saving 4 bytes
  1280.         elif (*(buffer + inputlength) == 0)
  1281.             done = TRUE;
  1282.         outputlength++;
  1283.         inputlength++;
  1284.     }
  1285.  
  1286.     // now we allocate the buffer
  1287.     if (!(StarBufferPtr = AllocVec(outputlength, MEMF_PUBLIC)))
  1288.         rq("Out of memory!");
  1289.  
  1290.     // now we translate into new buffer
  1291.     for (i = 0; i <= inputlength; i++) // second pass
  1292.     {   if (!strncmp(buffer + i, "\n*   ", 5))
  1293.         {   // currently we are at the LF.
  1294.             *(StarBufferPtr + outputpos) = ' ';
  1295.             i += 4; // plus the usual 1 incremented by the loop
  1296.         } else
  1297.         {   *(StarBufferPtr + outputpos) = *(buffer + i);
  1298.         }
  1299.         outputpos++;
  1300. }   }
  1301.  
  1302. AGLOBAL ULONG Hook4Func(struct Hook *h, VOID *o, VOID *msg)
  1303. {   /* "When the hook is called, the data argument points to the
  1304.     window object and message argument to the IntuiMessage." */
  1305.  
  1306.     UWORD code, qual;
  1307.  
  1308.     geta4(); // wait till here before doing anything
  1309.     code = ((struct IntuiMessage *) msg)->Code;
  1310.     qual = ((struct IntuiMessage *) msg)->Qualifier;
  1311.     switch(code)
  1312.     {
  1313.     case SCAN_HELP:
  1314.         helpabout();
  1315.     break;
  1316.     case SCAN_ESCAPE:
  1317.         if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT))
  1318.         {   cleanexit(EXIT_SUCCESS);
  1319.         } else
  1320.         {   page = 0;
  1321.         }
  1322.     break;
  1323.     case SCAN_B:
  1324.         if (page == 42)
  1325.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1 + inputs + returncode + 3]);
  1326.         }
  1327.     break;
  1328.     case SCAN_D:
  1329.         if (page == 41)
  1330.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_ST3]);
  1331.         }
  1332.     break;
  1333.     case SCAN_E:
  1334.         if (page == 42)
  1335.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1 + inputs + returncode + 1]);
  1336.         }
  1337.     break;
  1338.     case SCAN_F:
  1339.         if (page == 42)
  1340.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1]);
  1341.         }
  1342.     break;
  1343.     case SCAN_N:
  1344.         if (page == 41)
  1345.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_ST2]);
  1346.         } else
  1347.         {   // assert(page == 42);
  1348.             ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1 + inputs + returncode + 2]);
  1349.         }
  1350.     break;
  1351.     case SCAN_T:
  1352.         if (page == 41)
  1353.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_ST1]);
  1354.         }
  1355.     break;
  1356.     case SCAN_R:
  1357.         if (page == 41)
  1358.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_ST4]);
  1359.         } else
  1360.         {   // assert(page == 42);
  1361.             if (returncode)
  1362.             {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1 + inputs + 1]);
  1363.         }   }
  1364.     break;
  1365.     case SCAN_S:
  1366.         if (page == 42)
  1367.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1 + inputs + returncode + 4]);
  1368.         }
  1369.     break;
  1370.     case SCAN_V:
  1371.         if (page == 41)
  1372.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_IN1]);
  1373.         }
  1374.     break;
  1375.     default:
  1376.         if (page == 41 && code >= SCAN_1 && code <= SCAN_8)
  1377.         {   ActivateLayoutGadget(autodoc_gadgets[GID_4_LY1], MainWindowPtr, NULL, (Object) autodoc_gadgets[code - SCAN_1 + GID_4_ST5]);
  1378.         }
  1379.     break;
  1380.     }
  1381.  
  1382.     return(1);
  1383. }
  1384.  
  1385. AGLOBAL void autodoc2(void)
  1386. {   struct Hook    Hook4Struct;
  1387.     TEXT           GadTitle[MAXELEMENTS_4 + 1][VLONGFIELD + 1];
  1388.     ULONG          i, counter;
  1389.     struct TagItem tag_texteditor[4] =
  1390.     { { GA_ID,                    NULL                  }, // ti_Data filled later
  1391.       { GA_RelVerify,             TRUE                  },
  1392.       { GA_TEXTEDITOR_ExportWrap, 72,                   },
  1393.       { TAG_END,                  NULL                  },
  1394.     }, tag_subcaption[3] =
  1395.     { { LABEL_Text,               NULL                  }, // ti_Data filled later
  1396.       { LABEL_Justification,      LJ_CENTRE             },
  1397.       { TAG_END,                  NULL                  },
  1398.     }, tag_button[4] =
  1399.     { { GA_ID,                    GID_4_BU3             },
  1400.       { GA_RelVerify,             TRUE                  },
  1401.       { GA_Text,                  (ULONG) "_Other page" },
  1402.       { TAG_END,                  NULL                  }
  1403.     }, tag_supercaption[7] =
  1404.     { { LAYOUT_Orientation,       LAYOUT_ORIENT_VERT    },
  1405.       { LAYOUT_SpaceOuter,        TRUE                  },
  1406.       { LAYOUT_VertAlignment,     LALIGN_CENTER         },
  1407.       { LAYOUT_HorizAlignment,    LALIGN_CENTER         },
  1408.       { LAYOUT_BevelStyle,        BVS_NONE              },
  1409.       { LAYOUT_AddImage,          NULL                  }, // ti_Data filled later
  1410.       { TAG_END,                  NULL                  }
  1411.     }, tag_leftlayout[28] =
  1412.     { { LAYOUT_Orientation,       LAYOUT_ORIENT_VERT    },
  1413.       { LAYOUT_SpaceOuter,        TRUE                  },
  1414.       { LAYOUT_DeferLayout,       TRUE                  },
  1415.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1416.       { CHILD_WeightedHeight,     0                     },
  1417.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1418.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1419.       { CHILD_WeightedHeight,     0                     },
  1420.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1421.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1422.       { CHILD_WeightedHeight,     0                     },
  1423.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1424.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1425.       { CHILD_WeightedHeight,     0                     },
  1426.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1427.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1428.       { CHILD_WeightedHeight,     0                     },
  1429.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1430.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1431.       { CHILD_WeightedHeight,     0                     },
  1432.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1433.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1434.       { CHILD_WeightedHeight,     0                     },
  1435.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1436.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1437.       { CHILD_WeightedHeight,     0                     },
  1438.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1439.       { TAG_END,                  NULL                  },
  1440.     }, tag_rightlayout[25] =
  1441.     { { LAYOUT_Orientation,       LAYOUT_ORIENT_VERT    },
  1442.       { LAYOUT_SpaceOuter,        TRUE                  },
  1443.       { LAYOUT_DeferLayout,       TRUE                  },
  1444.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1445.       { CHILD_WeightedHeight,     0                     },
  1446.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1447.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1448.       { CHILD_WeightedHeight,     0                     },
  1449.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1450.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1451.       { CHILD_WeightedHeight,     0                     },
  1452.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1453.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1454.       { CHILD_WeightedHeight,     0                     },
  1455.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1456.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1457.       { CHILD_WeightedHeight,     0                     },
  1458.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1459.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1460.       { CHILD_WeightedHeight,     0                     },
  1461.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1462.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1463.       { CHILD_WeightedHeight,     0                     },
  1464.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1465.       { TAG_END,                  NULL                  },
  1466.     }, tag_bothlayout[8] =
  1467.     { { LAYOUT_Orientation,    LAYOUT_ORIENT_HORIZ   },
  1468.       { LAYOUT_SpaceOuter,     TRUE                  },
  1469.       { LAYOUT_DeferLayout,    TRUE                  },
  1470.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  1471.       { CHILD_WeightedWidth,   50                    },
  1472.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  1473.       { CHILD_WeightedWidth,   50                    },
  1474.       { TAG_END,               NULL                  }
  1475.     }, tag_rootlayout[9] =
  1476.     { { LAYOUT_Orientation,    LAYOUT_ORIENT_VERT    },
  1477.       { LAYOUT_SpaceOuter,     TRUE                  },
  1478.       { LAYOUT_DeferLayout,    TRUE                  },
  1479.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  1480.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  1481.       { CHILD_WeightedHeight,  0                     },
  1482.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  1483.       { CHILD_WeightedHeight,  0                     },
  1484.       { TAG_END,               NULL                  }
  1485.     }, tag_window[15] =
  1486.     { { WA_PubScreen,          NULL                  }, // ti_Data filled later
  1487.       { WA_ScreenTitle,        (ULONG) "Report+"                               },
  1488.       { WA_Title,              (ULONG) "Report+: Autodoc Editor (Page 2 of 2)" },
  1489.       { WA_Activate,           TRUE                  },
  1490.       { WA_DepthGadget,        TRUE                  },
  1491.       { WA_DragBar,            TRUE                  },
  1492.       { WA_CloseGadget,        TRUE                  },
  1493.       { WA_SizeGadget,         TRUE                  },
  1494.       { WA_IDCMP,              IDCMP_RAWKEY          },
  1495.       { WINDOW_IDCMPHook,      NULL                  }, // ti_Data filled later
  1496.       { WINDOW_IDCMPHookBits,  IDCMP_RAWKEY          },
  1497.       { WINDOW_MenuStrip,      NULL                  }, // ti_Data filled later
  1498.       { WINDOW_Position,       WPOS_FULLSCREEN       },
  1499.       { WINDOW_ParentGroup,    NULL                  }, // ti_Data filled later
  1500.       { TAG_END,               NULL                  }
  1501.     };
  1502.  
  1503.     strcpy(GadTitle[0], "_Function:");
  1504.     if (inputs)
  1505.     {   for (i = 1; i <= inputs; i++)
  1506.         {   strcpy(GadTitle[i], autodoc.var[i].name);
  1507.             strcat(GadTitle[i], ":");
  1508.     }   }
  1509.     if (returncode)
  1510.     {   strcpy(GadTitle[inputs + 1], "_Result:");
  1511.     }
  1512.     strcpy(GadTitle[inputs + 1 + returncode], "_Example:");
  1513.     strcpy(GadTitle[inputs + 2 + returncode], "_Notes:");
  1514.     strcpy(GadTitle[inputs + 3 + returncode], "_Bugs:");
  1515.     strcpy(GadTitle[inputs + 4 + returncode], "_See Also:");
  1516.  
  1517.     /* window
  1518.         root-layout
  1519.          both-layout
  1520.           left-layout
  1521.            super-caption
  1522.             sub-caption
  1523.            texteditor
  1524.           right-layout
  1525.            super-caption
  1526.             sub-caption
  1527.            texteditor
  1528.          button
  1529.          button */
  1530.  
  1531.     counter = 3;
  1532.     for (i = 0; i <= elements / 2; i++)
  1533.     {   tag_subcaption[0].ti_Data          = (ULONG) GadTitle[i];
  1534.         tag_texteditor[0].ti_Data          = GID_4_TE1 + i;
  1535.         tag_supercaption[5].ti_Data        = (ULONG) NewObjectA(LABEL_GetClass(),      NULL, tag_subcaption);
  1536.         tag_leftlayout[counter].ti_Data    = (ULONG) NewObjectA(LAYOUT_GetClass(),     NULL, tag_supercaption);
  1537.         counter += 2;
  1538.         tag_leftlayout[counter].ti_Data    =
  1539.         autodoc_gadgets[GID_4_TE1 + i]     = (ULONG) NewObjectA(TEXTEDITOR_GetClass(), NULL, tag_texteditor);
  1540.         counter++;
  1541.     }
  1542.     tag_leftlayout[counter].ti_Tag         = TAG_END;
  1543.     counter = 3;
  1544.     for (i = (elements / 2) + 1; i <= elements; i++)
  1545.     {   tag_subcaption[0].ti_Data          = (ULONG) GadTitle[i];
  1546.         tag_texteditor[0].ti_Data          = GID_4_TE1 + i;
  1547.         tag_supercaption[5].ti_Data        = (ULONG) NewObjectA(LABEL_GetClass(),      NULL, tag_subcaption);
  1548.         tag_rightlayout[counter].ti_Data   = (ULONG) NewObjectA(LAYOUT_GetClass(),     NULL, tag_supercaption);
  1549.         counter += 2;
  1550.         tag_rightlayout[counter].ti_Data   =
  1551.         autodoc_gadgets[GID_4_TE1 + i]     = (ULONG) NewObjectA(TEXTEDITOR_GetClass(), NULL, tag_texteditor);
  1552.         counter++;
  1553.     }
  1554.     tag_rightlayout[counter].ti_Tag         = TAG_END;
  1555.  
  1556.     tag_bothlayout[3].ti_Data   = (ULONG) NewObjectA(LAYOUT_GetClass(), NULL,            tag_leftlayout);
  1557.     tag_bothlayout[5].ti_Data   = (ULONG) NewObjectA(LAYOUT_GetClass(), NULL,            tag_rightlayout);
  1558.     tag_rootlayout[3].ti_Data   = (ULONG) NewObjectA(LAYOUT_GetClass(), NULL,            tag_bothlayout);
  1559.     tag_rootlayout[4].ti_Data   =
  1560.     autodoc_gadgets[GID_4_BU3]  = (ULONG) NewObjectA(NULL,              "button.gadget", tag_button);
  1561.     tag_button[0].ti_Data       = GID_4_BU4;
  1562.     tag_button[2].ti_Data       = (ULONG) "Menu";
  1563.     tag_rootlayout[6].ti_Data   =
  1564.     autodoc_gadgets[GID_4_BU4]  = (ULONG) NewObjectA(NULL,              "button.gadget", tag_button);
  1565.     tag_window[13].ti_Data      =
  1566.     autodoc_gadgets[GID_4_LY2]  = (ULONG) NewObjectA(LAYOUT_GetClass(), NULL,            tag_rootlayout);
  1567.  
  1568.     InitHook(&Hook4Struct, Hook4Func, NULL);
  1569.     tag_window[9].ti_Data       = &Hook4Struct;
  1570.     lockscreen();
  1571.     tag_window[0].ti_Data       = (ULONG) ScreenPtr;
  1572.     gadtools();
  1573.     tag_window[11].ti_Data      = MenuPtr;
  1574.     WinObject[4]                = (ULONG) NewObjectA(WINDOW_GetClass(), NULL,             tag_window);
  1575.     unlockscreen();
  1576.     if (!WinObject[4]) // Object creation successful?
  1577.     {   rq("Can't create ReAction objects!");
  1578.     }
  1579.     openwindow();
  1580.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVE,   NOSUB));
  1581.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVEAS, NOSUB));
  1582.     /* New and Open... are not permitted from pages 14 and 42, since the
  1583.        opened document might need a different number of text editor
  1584.        gadgets. */
  1585.  
  1586.     // Do any necessary imports.
  1587.     SetGadgetAttrs
  1588.     (   autodoc_gadgets[GID_4_TE1], MainWindowPtr, NULL,
  1589.         GA_TEXTEDITOR_Contents,     autodoc.function
  1590.     );
  1591.     if (inputs)
  1592.     {   for (i = 1; i <= inputs; i++)
  1593.         {   SetGadgetAttrs
  1594.             (   autodoc_gadgets[GID_4_TE1 + i], MainWindowPtr, NULL,
  1595.                 GA_TEXTEDITOR_Contents, autodoc.var[i].desc
  1596.             );
  1597.     }   }
  1598.     if (returncode)
  1599.     {   SetGadgetAttrs
  1600.         (   autodoc_gadgets[GID_4_TE1 + inputs + 1], MainWindowPtr, NULL,
  1601.             GA_TEXTEDITOR_Contents, autodoc.var[0].desc
  1602.         ); // return code
  1603.     }
  1604.     SetGadgetAttrs
  1605.     (   autodoc_gadgets[GID_4_TE1 + inputs + returncode + 1], MainWindowPtr, NULL,
  1606.         GA_TEXTEDITOR_Contents, autodoc.example
  1607.     );
  1608.     SetGadgetAttrs
  1609.     (   autodoc_gadgets[GID_4_TE1 + inputs + returncode + 2], MainWindowPtr, NULL,
  1610.         GA_TEXTEDITOR_Contents, autodoc.notes
  1611.     );
  1612.     SetGadgetAttrs
  1613.     (   autodoc_gadgets[GID_4_TE1 + inputs + returncode + 3], MainWindowPtr, NULL,
  1614.         GA_TEXTEDITOR_Contents, autodoc.bugs
  1615.     );
  1616.     SetGadgetAttrs
  1617.     (   autodoc_gadgets[GID_4_TE1 + inputs + returncode + 4], MainWindowPtr, NULL,
  1618.         GA_TEXTEDITOR_Contents, autodoc.seealso
  1619.     );
  1620.  
  1621.     ActivateLayoutGadget(autodoc_gadgets[GID_4_LY2], MainWindowPtr, NULL, (Object) autodoc_gadgets[GID_4_TE1]);
  1622.     loop();
  1623.     closewindow();
  1624. }
  1625.  
  1626. MODULE ULONG parseeither(STRPTR terminator1, STRPTR terminator2)
  1627. {   ULONG dest = 0; // index in destination string
  1628.  
  1629. /* When this returns, offset points just past the end of the terminator
  1630. string. string contains what was found before the terminator string. */
  1631.  
  1632.     while (1)
  1633.     {   if (IOBuffer[offset] != CR)
  1634.         {   string[dest] = IOBuffer[offset];
  1635.         }
  1636.         if (!strncmp(&IOBuffer[offset], terminator1, strlen(terminator1)))
  1637.         {   string[dest] = 0;
  1638.             offset += strlen(terminator1);
  1639.             return(1);
  1640.         } elif (!strncmp(&IOBuffer[offset], terminator2, strlen(terminator2)))
  1641.         {   string[dest] = 0;
  1642.             offset += strlen(terminator2);
  1643.             return(2);
  1644.         } elif (offset > strlen(IOBuffer)) // we are past the end of the buffer
  1645.         {   string[0] = 0;
  1646.             return(0);
  1647.         } else
  1648.         {   offset++;
  1649.             if (IOBuffer[offset] != CR)
  1650.             {   dest++;
  1651. }   }   }   }
  1652.  
  1653. MODULE void numberofinputs(void)
  1654. {   ULONG i;
  1655.  
  1656.     if (autodoc.var[0].name[0])
  1657.         returncode = 1; // non-boolean as it's used mathematically
  1658.     else returncode = 0;
  1659.  
  1660.     inputs = 0;
  1661.     for (i = 1; i <= 8; i++)
  1662.     {   if (autodoc.var[i].name[0])
  1663.             inputs++;
  1664.         else break;
  1665.     }
  1666.     elements = inputs + 4 + returncode;
  1667. }
  1668.